#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
获取文件类型提示词
根据指定的文件类型获取对应的提示词配置
支持先通用识别，再根据识别到的文件类型进行详细处理
"""

import os
import sys
import importlib.util
from typing import Dict, Any, Optional, Tuple

agent_prompt_type_mappings={
    "通用json":{
        "prompt": """你是一个专业的结构化数据提取助手。请将图片中的关键信息提取为规范的JSON格式，要求如下：
    1. 输出格式必须严格遵循：{'json_result_cn':{'中文键':'名称',},'json_result_en':{'en_key':'名称',},}
    2. 对于每个字段，同时提供中文键名和对应的英文键名
    3. 中文键名使用中文字符，英文键名使用小写字母和下划线分隔的命名方式
    4. 根据图片类型进行不同处理：
    - 文档/表单：识别各个字段的标签和值，结构化提取
    - 表格：使用表头作为key，单元格内容作为value
    - 卡片/证件：提取各类标识信息
    - 海报/广告：提取关键产品信息、价格、日期等
    5. 所有数值保留原始格式和单位
    6. 对于图片中不存在的信息，相应字段赋值为null
    7. 对于特殊符号和字符，请完整保留
    8. 确保中文键和对应的英文键值完全一致
    
    示例输出：
    {'json_result_cn': {
        '中文键': '名称', 
        },
        'json_result_en': {
        'en_key': '名称', 
        },
    }
    
    现在请分析这张图片内容：
    """
    }
    ,
    "发票":
        {  "prompt": """\n值得注意的是,结果加上json_result_invoice部分，其显示键名需严格遵循以下定义:
            "machineNo": {"description": "机器号", "example": "667220920461"},
            "no": {"description": "发票号码", "example": "10043526"},
            "invoiceType": {"description": "发票票种", "example": "专票"},
            "specificBusinessTypes": {"description": "特定业务类型", "example": "建筑服务"},
            "invoiceNumber": {"description": "发票编号", "example": "24122000000005148765"},
            "invoicingDate": {"description": "开票日期", "example": "2015年09月22日"},
            "purchaserName": {"description": "购买方名称", "example": "天津市海纳众诚科技有限公司"},
            "purchaserCode": {"description": "购买方纳税人识别号", "example": "91120116MA074AJDXP"},
            "sellerName": {"description": "销售方名称", "example": "天津中科昊宇科技有限公司"},
            "sellerCode": {"description": "销售方纳税人识别号", "example": "91120116MA07J8594A"},
            "tradeName": {"description": "货物名称（保留\"*\"）", "example": "*信息技术服务*技术服务费"},
            "model": {"description": "规格型号", "example": ""},
            "unit": {"description": "单位", "example": "项"},
            "number": {"description": "数量", "example": ""},
            "unitPrice": {"description": "单价", "example": ""},
            "totalPrice": {"description": "金额（单价×数量）", "example": "95439.62"},
            "taxRate": {"description": "税率", "example": "6%"},
            "taxAmount": {"description": "税额", "example": "5726.38"},
            "totalAmount": {"description": "合计金额", "example": "95439.62"},
            "totalTax": {"description": "合计税额", "example": "5726.38"},
            "payee": {"description": "收款人", "example": "权枢兆基"},
            "reviewer": {"description": "复核", "example": "张金婵"},
            "drawer": {"description": "开票人", "example": "马晓静"},
            "totalBig": {"description": "价税合计(大写)", "example": "壹拾万壹仟壹佰陆拾陆圆整"},
            "totalSmall": {"description": "价税合计(小写)", "example": "101166"},
            "remark": {"description": "备注", "example": ""}
            """
        }
        
}

def get_file_type_mappings():
    """返回所有可用的文件类型映射"""
    return agent_prompt_type_mappings

def get_prompt_by_type(file_type: str="发票") -> Optional[Dict[str, Any]]:
    """
    根据文件类型从file_type_map_prompt.py中获取相应的提示词配置
    
    Args:
        file_type: 文件类型，如"发票"
    
    Returns:
        包含字段描述和字段信息的字典，如果未找到则返回None
    """
    # 查找指定文件类型的配置
    file_type_mappings=get_file_type_mappings()
    if file_type in file_type_mappings:
        return file_type_mappings[file_type]
    else:
        print(f"未找到文件类型 '{file_type}' 的配置")
        return None

def get_agent_by_type(agent_type: str) -> Optional[str]:
    """
    根据智能体类型从agent_prompt_type_mappings获取对应的提示词
    
    Args:
        agent_type: 智能体类型，对应agent_prompt_type_mappings的键名
    
    Returns:
        对应的提示词，如果未找到则返回None
    """
    mappings = get_file_type_mappings()
    if agent_type in mappings:
        return mappings[agent_type]["prompt"]
    else:
        print(f"未找到智能体类型 '{agent_type}' 的配置")
        return None

def get_available_agent_types() -> list:
    """
    获取所有可用的智能体类型
    
    Returns:
        包含所有可用智能体类型的列表
    """
    return list(get_file_type_mappings().keys())
